package com.bestv.bsr.core.service.impl.jt.dto.response;

import com.bestv.bsr.core.entities.vo.RecDataVo;
import com.bestv.bsr.core.entities.vo.RecGroupListVo;
import com.bestv.bsr.core.entities.vo.RecItemVoListVo;
import com.bestv.bsr.core.service.impl.jt.validate.JTValidGroups;
import com.bestv.bsr.core.utils.RecommendIdUtils;
import lombok.*;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 九天 主题推荐响应dto
 *
 * @author taojiacheng
 */
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
@ToString
public class JTTopicResponseDto {

    @NotNull(groups = JTValidGroups.TOPIC_DETAIL_VALID.class)
    private Integer code;

    private String msg;

    @NotNull(groups = JTValidGroups.TOPIC_DETAIL_VALID.class)
    @Valid
    private RespData data;

    private Boolean ok;


    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    @ToString
    public static class RespData {

        /**
         * response id, 与request id⼀致
         */
        @NotBlank(groups = JTValidGroups.TOPIC_DETAIL_VALID.class)
        private String id;

        /**
         * trace_id，标识了本次推荐结果，⽤于关联本次推荐的⽤户后续⾏为，例如曝光、点击、播
         * 放、订购⾏为；以便服务端进⾏推荐效果数据统计、⼩流量实验分层效果统计等；
         * 【ver_bucket_sortid_channelID_userid_recommtime_responseid_signal_itemtype】
         */
        @NotBlank(groups = JTValidGroups.TOPIC_DETAIL_VALID.class)
        private String trace_id;

        /**
         * 曝光反馈URL，⼀个分类作为⼀个模块，⽤户停留5s后统⼀发送曝光反馈即反馈接⼝的url内
         * 容，增加signal，其中itemid有ೌ照⽅填充（媒资id逗号分隔拼接），operate_time由牌照⽅
         * 或cp⽅填充，其余由推荐平台端⽣成，包含所在模块的标识
         */
        @NotBlank(groups = JTValidGroups.TOPIC_DETAIL_VALID.class)
        private String display_tracker;

        /**
         * 每个主题的媒资列表
         */
        @Valid
        @NotNull(groups = JTValidGroups.TOPIC_DETAIL_VALID.class)
        private List<Channel> list;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    @ToString
    public static class Channel {
        /**
         * 主题标题
         */
        @NotNull(groups = JTValidGroups.TOPIC_DETAIL_VALID.class)
        private String title;

        /**
         * 主题唯一标识，和传过来的参数对应
         */
        private String topicid;

        /**
         * 推荐item列表
         */
        @Valid
        private List<Item> items;

        /**
         * 对应这个频道的display tracker
         * 通常需要牌照/cp方填充operate_time和itemid字段
         */
        @NotBlank(groups = JTValidGroups.TOPIC_DETAIL_VALID.class)
        private String display_tracker;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    @ToString
    public static class Item {
        /**
         * 推荐理由
         */
        private String explain;

        /**
         * cpid+ |+节目集id【牌照会根据该字段进行内容有效性校验，所以必填】
         */
        @NotNull(groups = JTValidGroups.TOPIC_DETAIL_VALID.class)
        private String albumid;

        /**
         * 支持的位置【与传递的positions 对应】一个位置可推荐多个item，
         * 即能保证实现滑动效果展示更多内容，
         * 也避免因牌照方临时下线导致只能展示默认结果的情况（暂不支持）；
         */
        private String support_pos;


        /**
         * 点击反馈URL即反馈接口的url内容，增加 signal，
         * 其中operate_time由牌照方或cp方填充，其余由推荐平台端生成
         */
        @NotNull(groups = JTValidGroups.TOPIC_DETAIL_VALID.class)
        private String click_tracker;

        /**
         * 观看反馈URL即反馈接口的url内容，增加 signal， 其中operate_time由牌照方或cp方填充，其余由推荐平台端生成
         */
        @NotNull(groups = JTValidGroups.TOPIC_DETAIL_VALID.class)
        private String play_tracker;

        /**
         * 牌照方或内容提供方唯一标识【平台生成分配】(此处可以是所有cp)
         */
        @NotNull(groups = JTValidGroups.TOPIC_DETAIL_VALID.class)
        private String cpid;

        /**
         * 专辑id
         */
        @NotNull(groups = JTValidGroups.TOPIC_DETAIL_VALID.class)
        private String itemid;

        /**
         * 专辑名称
         */
        @NotNull(groups = JTValidGroups.TOPIC_DETAIL_VALID.class)
        private String itemname;

        /**
         * 媒资海报（竖版)下载的ur地址，可以有多个,多个的话使用,做分隔【英文的符号】
         */
        @NotNull(groups = JTValidGroups.TOPIC_DETAIL_VALID.class)
        private String picurl;

        /**
         * 媒资海报（横版)下载的ur地址，分割方法同上
         */
        @NotNull(groups = JTValidGroups.TOPIC_DETAIL_VALID.class)
        private String picurl_v;

        /**
         * 如果请求中存在picsize， 则会将对应大小的 picurl记录在这里，分割方法同上
         */
        private String picurl_required;

        /**
         * 点击媒资海报进入的落地页跳转参数
         */
        private String gotourl;

        /**
         * 一句话介绍
         */
        private String onebref;

        /**
         * 角标
         */
        private String cornersign;

        /**
         * 更新集数
         */
        private String updateVideonum;

        /**
         * 媒资评分
         */
        private String score;

    }

    /**
     * 转换返回结果
     */
    public RecDataVo convertToRecData(String itemType) {
        RecDataVo recDataVo = new RecDataVo();
        recDataVo.setRecResultId(RecommendIdUtils.replaceSymbol(this.data.trace_id, "[|]", "$$"));
        /**
         * 内容提供方
         * 00001：百视通
         * 00002：易视腾
         */
        recDataVo.setAppId("");
        recDataVo.setExpId("base");
        recDataVo.setStrategyId("");
        recDataVo.setDisplayTracker(this.data.display_tracker);

        /**
         * 根据topicId 做分组
         */
        List<RecGroupListVo> recGroupListVos = new ArrayList<>();
        Map<String, List<Channel>> topicIdChannelMap = this.data.list.stream().collect(Collectors.groupingBy(Channel::getTopicid));
        topicIdChannelMap.forEach((key, val) -> {
            RecGroupListVo recGroupListVo = new RecGroupListVo();
            recGroupListVo.setItemType(itemType);
            List<RecItemVoListVo> recItemVoListVos = new ArrayList<>();
            val.forEach(channel -> {
                List<Item> items = channel.items;
                items.forEach(item -> {
                    RecItemVoListVo recItemVoListVo = new RecItemVoListVo();
                    String itemid = item.itemid;
                    if (itemid.contains("|")) {
                        itemid = itemid.substring(itemid.indexOf("|") + 1);
                    }
                    recItemVoListVo.setItemCode(itemid);
                    recItemVoListVo.setItemName(item.itemname);
                    recItemVoListVo.setCpid(item.cpid);
                    recItemVoListVo.setApkurl(item.gotourl);
                    recItemVoListVo.setCls("");
                    recItemVoListVo.setPkg("");
                    recItemVoListVo.setBacktype("");
                    recItemVoListVo.setVersioncode("");
                    recItemVoListVo.setPoster(item.picurl);
                    recItemVoListVo.setMarkPos("");
                    recItemVoListVo.setMarkUrl("");
                    recItemVoListVo.setMedMarkUrl("");
                    recItemVoListVo.setMedMarkPos(item.cornersign);
                    recItemVoListVos.add(recItemVoListVo);
                });
            });
            recGroupListVo.setRecItemVoList(recItemVoListVos);
            recGroupListVo.setItemCodeList(recItemVoListVos.stream()
                    .map(RecItemVoListVo::getItemCode)
                    .distinct()
                    .collect(Collectors.toList()));
            recGroupListVos.add(recGroupListVo);
        });

        recDataVo.setGroupList(recGroupListVos);
        recDataVo.setExtInfos(Collections.emptyList());
        return recDataVo;
    }
}
